package com.io.serializable_;

import java.io.FileInputStream;
import java.io.IOException;
import java.io.ObjectInputStream;

/**
 * 反序化操作
 */
public class ObjectInputStream_ {
    public static void main(String[] args) throws IOException, ClassNotFoundException {
        // 指定反序列化的文件
        String filePath = "E:\\test\\data.java";

        ObjectInputStream ois = new ObjectInputStream(new FileInputStream(filePath));
        // 注意：
        // 1.读取(反序列化)的顺序需要和你保存数据(序列化)的顺序一致，否则会出现异常
        // 2.顺序不能有错
        System.out.println(ois.readInt());
        System.out.println(ois.readBoolean());
        System.out.println(ois.readUTF());
        System.out.println(ois.readChar());
        System.out.println(ois.readDouble());
        /**
         * readObject()可能抛出的异常有：
         * 1.ClassNotFoundException：没有找到对应的Class；
         * 2.InvalidClassException：Class不匹配。
         * 比如，你现在在 Dog对象添加了一个新的方法，现在反序列化获取对象
         * 之后进行调用，就会报错 InvalidClassException，因为序列化保
         * 存的是之前的对象信息，新的方法是不存在序列化文件，导致报错
         * 所以更新对象信息，需要重新序列化。
         */
        // 编译时数据类型是 Object ，运行时数据类型是 Dog
        Object dog = ois.readObject(); // Object -> Dog
        System.out.println(dog);//  底层返回是 Object 类型，但自动转换 Dog

        // 1.如果我们希望调用Dog的方法 ，比如 set/get 需要向下转型
        Dog dogs = (Dog) dog;
        System.out.println(dogs.getName()); // 旺财
        // 关闭外层资源流 ,底层会关闭 FileInputStream 流
        ois.close();
    }
}
